package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 使用块读写形式完成文件复制
 *
 * 提高每次读写的数据量减少实际读写的次数，可以提高读写效率
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("image.png");
        FileOutputStream fos = new FileOutputStream("image_cp2.png");
        int len;//每次块读后实际读取到的字节数
        /*
            00000000   1byte   1字节
            1024 byte  1kb
            1024 kb    1mb
            1024 mb    1gb
            1024 gb    1tb
            1024 tb    1pb
         */
        byte[] buffer = new byte[1024 * 10];//10kb
        long start = System.currentTimeMillis();
        /*
            java.io.InputStream上定义的块读操作:
            int read(byte[] data)
            一次性从流中读取给定字节数组data总长度的字节量并存入到data数组中
            返回值为实际读取到的字节量，它也标志这本次读取后data数组前多少个字节是
            本次读取到的数据
            如果返回值为-1则表示流已经读取到了末尾。

            java.io.OutputStream上定义的块写操作:
            void write(byte[] data)
            一次性将给定字节数组data中所有的字节写出

            void write(byte[] data,int off,int len)
            一次性将给定字节数组data中从下标off处开始的连续len个字节一次性写出
         */
        while((len = fis.read(buffer))!=-1){
//            fos.write(buffer);
            fos.write(buffer,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕！耗时:"+(end-start)+"ms");
        fis.close();
        fos.close();
    }
}

